# 练习使用 Sobel算子

import numpy as np
import cv2
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import pickle


# 读取图片
image = mpimg.imread('signs_vehicles_xygrad.png')

# 定义一个函数输出 Sobel x or y, 
# 然后获取一个绝对值并应用一个阈值
def abs_sobel_thresh(img, orient='x', thresh_min=0, thresh_max=255):
    
	# 用以下的步骤处理传入的图象 img
	# 1) 转化为灰度图
	gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
	# 2) 取 x 和 y 的导数，给定方向'x'或'y'
	if orient == 'x':
		# 计算导数 X 方向
		sobel = cv2.Sobel(gray, cv2.CV_64F, 1, 0)

	# 计算导数 Y 方向
	if orient == 'y':
		sobel = cv2.Sobel(gray, cv2.CV_64F, 0, 1)

	# 3) 取导数或梯度的绝对值
	abs_sobelx = np.absolute(sobel)

	# 4) 缩放八位 以及 格式转换
	scaled_sobel = np.uint8(255 * abs_sobelx / np.max(abs_sobelx))

	# 5) 创建1的遮罩，其中缩放的渐变幅值
	binary_output = np.zeros_like(scaled_sobel)
	binary_output[(scaled_sobel >= thresh_min) & (scaled_sobel <= thresh_max)] = 1

	# 返回结果
	return binary_output
    
# 执行这个函数
grad_binary = abs_sobel_thresh(image, orient='x', thresh_min=20, thresh_max=100)

# 可视化结果
f, (ax1, ax2) = plt.subplots(1, 2, figsize=(24, 9))
f.tight_layout()
ax1.imshow(image)
ax1.set_title('Original Image', fontsize=50)
ax2.imshow(grad_binary, cmap='gray')
ax2.set_title('Thresholded Gradient', fontsize=50)
plt.subplots_adjust(left=0., right=1, top=0.9, bottom=0.)
plt.show()

